// utils/api.js
const app = getApp()

/**
 * 封装微信小程序的网络请求
 * @param {Object} options 请求配置
 * @returns {Promise}
 */
function request(options) {
  return new Promise((resolve, reject) => {
    const defaultOptions = {
      timeout: 30000,
      header: {
        'Content-Type': 'application/json'
      }
    }
    
    const requestOptions = {
      ...defaultOptions,
      ...options,
      header: {
        ...defaultOptions.header,
        ...options.header
      },
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res)
        } else {
          reject(res)
        }
      },
      fail: (error) => {
        reject(error)
      }
    }
    
    wx.request(requestOptions)
  })
}

/**
 * GET请求
 * @param {string} url 请求地址
 * @param {Object} data 请求参数
 * @param {Object} options 其他配置
 * @returns {Promise}
 */
function get(url, data = {}, options = {}) {
  const queryString = Object.keys(data)
    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
    .join('&')
  
  const fullUrl = queryString ? `${url}?${queryString}` : url
  
  return request({
    url: fullUrl,
    method: 'GET',
    ...options
  })
}

/**
 * POST请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 * @returns {Promise}
 */
function post(url, data = {}, options = {}) {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  })
}

/**
 * PUT请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 * @returns {Promise}
 */
function put(url, data = {}, options = {}) {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  })
}

/**
 * DELETE请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 * @returns {Promise}
 */
function del(url, data = {}, options = {}) {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  })
}



/**
 * 处理API错误
 * @param {Object} error 错误对象
 * @param {string} defaultMessage 默认错误消息
 */
function handleApiError(error, defaultMessage = '网络错误，请重试') {
  console.error('API Error:', error)
  
  let message = defaultMessage
  
  if (error.statusCode) {
    switch (error.statusCode) {
      case 400:
        message = '请求参数错误'
        break
      case 401:
        message = '认证失败，请重新登录'
        break
      case 403:
        message = '没有权限访问'
        break
      case 404:
        message = '请求的资源不存在'
        break
      case 429:
        message = '请求过于频繁，请稍后重试'
        break
      case 500:
        message = '服务器内部错误'
        break
      case 502:
        message = '网关错误'
        break
      case 503:
        message = '服务暂时不可用'
        break
      default:
        if (error.data && error.data.message) {
          message = error.data.message
        }
    }
  } else if (error.errMsg) {
    if (error.errMsg.includes('timeout')) {
      message = '请求超时，请检查网络连接'
    } else if (error.errMsg.includes('fail')) {
      message = '网络连接失败，请检查网络设置'
    }
  }
  
  wx.showToast({
    title: message,
    icon: 'none',
    duration: 3000
  })
  
  return message
}

/**
 * 显示加载提示
 * @param {string} title 提示文字
 */
function showLoading(title = '加载中...') {
  wx.showLoading({
    title,
    mask: true
  })
}

/**
 * 隐藏加载提示
 */
function hideLoading() {
  wx.hideLoading()
}

/**
 * 显示成功提示
 * @param {string} title 提示文字
 */
function showSuccess(title) {
  wx.showToast({
    title,
    icon: 'success',
    duration: 2000
  })
}

/**
 * 显示错误提示
 * @param {string} title 提示文字
 */
function showError(title) {
  wx.showToast({
    title,
    icon: 'none',
    duration: 3000
  })
}

module.exports = {
  request,
  get,
  post,
  put,
  delete: del,
  handleApiError,
  showLoading,
  hideLoading,
  showSuccess,
  showError
}